home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / range < prev    next >
Encoding:
Text File  |  1992-08-15  |  1.0 KB  |  44 lines

  1. int
  2. do_range(gimme,arglast)
  3. int gimme;
  4. int *arglast;
  5. {
  6.     STR **st = stack->ary_array;
  7.     register int sp = arglast[0];
  8.     register int i;
  9.     register ARRAY *ary = stack;
  10.     register STR *TARG;
  11.     int max;
  12.  
  13.     if (gimme != G_ARRAY)
  14.     fatal("panic: do_range");
  15.  
  16.     if (st[sp+1]->str_nok || !st[sp+1]->str_pok ||
  17.       (looks_like_number(st[sp+1]) && *st[sp+1]->str_ptr != '0') ) {
  18.     i = (int)str_gnum(st[sp+1]);
  19.     max = (int)str_gnum(st[sp+2]);
  20.     if (max > i)
  21.         (void)astore(ary, sp + max - i + 1, Nullstr);
  22.     while (i <= max) {
  23.         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  24.         str_numset(TARG,(double)i++);
  25.     }
  26.     }
  27.     else {
  28.     STR *final = str_mortal(st[sp+2]);
  29.     char *tmps = str_get(final);
  30.  
  31.     TARG = str_mortal(st[sp+1]);
  32.     while (!TARG->str_nok && TARG->str_cur <= final->str_cur &&
  33.         strNE(TARG->str_ptr,tmps) ) {
  34.         (void)astore(ary, ++sp, TARG);
  35.         TARG = str_2mortal(str_smake(TARG));
  36.         str_inc(TARG);
  37.     }
  38.     if (strEQ(TARG->str_ptr,tmps))
  39.         (void)astore(ary, ++sp, TARG);
  40.     }
  41.     return sp;
  42. }
  43.  
  44.